<!-- 把父构造函数中的方法继承过来 -->
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        function Father(uname, age) {
            this.uname = uname;
            this.age = age;
        }

        Father.prototype.money = function () {   //公有的方法
            consoloe.log(10000000);
        }

        function Son(uname, age) {
            var that = this;
            Father.call(that, uname, age);
        }
        // Son.prototype = Father.prototype;   //这样赋值错误的
        //这里相当于父类构造函数中的地址传值给儿子构造函数，儿子原型指向父亲原型即地址
        //子原型对象可以把父类构造函数进行了修改

        //问题1：上面这句话Son.prototype = Father.prototype可以把父类找那个的方法继承过来这没问题
        //但是这步操作，儿子原型指向父亲原型即地址，只要子类原型对象进行及修改或者添加，父亲也会受到影响
        //这个类似于C上面的地址传值



        Son.prototype = new Father();  //把Father的对象实例赋值给Son.prototype,Son.prototype就指向Father的对象实例
        //这样一来Son.prototype就可以使用Father独享实例里面的money()方法
        //实例化这个对象赋值给Son这个原型对象，Father实例对象也可以访问Fahter原型对象(Fahter里面有一个__proto__对象原型可以访问Father原型对象)
        //当然 Son.prototype添加exam这个方法时，是自己独有的方法，和Father实例对象还有原型对象没有关系

        //如果利用的对象的形式修改了原型对象，别忘了利用constructor指回原来的构造函数
        Son.prototype.constructor = Son;
        Son.prototype.exam = function () {   //孩子加了这个方法，父亲会不会受影响
            console.log('孩子要考试了');
        }
        var son = new Son('刘德华', 18);
        console.log(son);
        console.log(new Father());
        console.log(Father.prototype);
        console.log(Son.prototype.constructor);
        //Son.prototype被父类的实例对象覆盖了，所以里面没有constructor
    </script>
</body>

</html>